﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

using Canroc.Net.Application.LogByAuthService.Dto;

// ReSharper disable once CheckNamespace
namespace Canroc.Net.Application.LogByAuthService;

/// <summary>
///     系统鉴权日志应用服务
/// </summary>
public class LogByAuthAppService(
    SqlSugarRepository<LogByAuth> authenticationRep,
    IHttpContextAccessor httpContextAccessor
) : IDynamicApiController, ITransient
{
    /// <summary>
    ///     添加系统鉴权日志
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> AddAsync(AuthLogInput data)
    {
        var entity = data.Adapt<LogByAuth>();
        //解析IP地址和浏览器以及操作系统信息
        var searcher = new Searcher(CachePolicy.File,
            Path.Combine(AppContext.BaseDirectory, "ResourceInfo", "ip2region_v4.xdb"));
        entity.Address = searcher.Search(data.Ip)?.Replace("|", "--") ?? "未知地址";
        if (entity.Address.IndexOf("0--0--", StringComparison.Ordinal) > -1)
        {
            entity.Address = "内网IP";
        }

        entity.Browser = HttpContextHelper.GetBrowserInfo(httpContextAccessor.HttpContext);
        entity.OsInfo = HttpContextHelper.GetOsInfo(httpContextAccessor.HttpContext);
        return await authenticationRep.InsertAsync(entity);
    }

    /// <summary>
    ///     编辑系统鉴权日志
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> EditAsync(AuthLogInput data)
    {
        var entity = await authenticationRep.GetByIdAsync(data.Id);
        // 更新数据
        data.Adapt(entity);
        return await authenticationRep.UpdateAsync(entity);
    }

    /// <summary>
    ///     获取系统鉴权日志
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public async Task<AuthLogOutput?> GetDataAsync(Guid id)
    {
        return await authenticationRep.AsQueryable().Where(l => l.Id == id).Select<AuthLogOutput>().FirstAsync();
    }

    /// <summary>
    ///     分页: 系统鉴权日志集合
    /// </summary>
    /// <param name="query">请求参数</param>
    /// <returns></returns>
    public async Task<PageModel<AuthLogOutput>> GetPageAsync([FromQuery] AuthLogPageQuery query)
    {
        return await authenticationRep
            .AsQueryable()
            .LeftJoin<SysUser>((l, u) => l.Account == u.Account)
            .WhereIF(!query.Account.IsNullOrEmpty(), l => l.Account.Contains(query.Account!))
            .WhereIF(!query.Ip.IsNullOrEmpty(), l => l.Ip.Contains(query.Ip!))
            .WhereIF(!query.Browser.IsNullOrEmpty(), l => l.Browser.Contains(query.Browser!))
            .WhereIF(!query.OsInfo.IsNullOrEmpty(), l => l.OsInfo.Contains(query.OsInfo!))
            .WhereIF(query.Date is not null && query.Date.Count == 2,
                l => l.CreateTime > Convert.ToDateTime(query.Date![0]) &&
                     l.CreateTime < Convert.ToDateTime(query.Date![1]).AddDays(1))
            .Select((l, u) => new AuthLogOutput { UserName = u.Name }, true)
            .OrderByPropertyName(query.OrderField, query.IsAscending ? OrderByType.Asc : OrderByType.Desc)
            .ToPageAsync(query.PageIndex, query.PageSize);
    }
}